package com.le.tester.book.effectivejava3rdchinese.articleserven;

import java.util.Arrays;
import java.util.EmptyStackException;
import java.util.WeakHashMap;

/**
 * createTime：2022/8/1 15:14
 * description：消除过期的对象引用，过期的对象将不会被垃圾回收，
 * 因此是在增加消耗内存，因此将过期的对象设置成null触发垃圾回收是有必要的
 * 虽然有垃圾回收机制，但是应该要懂得怎么触发这个垃圾回收机制，防止oom
 */
public class LStack {

    private Object[] elements;

    private int size = 0;

    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public LStack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {

        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        return elements[--size];
    }

    private void ensureCapacity() {
        if (elements.length == size) {
            //这个地方内存的占用会一直的增加
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }

    }

    public Object popPlus() {
        if (size == 0) {
            throw new EmptyStackException();
        }
        Object result = elements[--size];

        new WeakHashMap<>();
        elements[size] = null;
        return result;

    }

}
